// 创建一个新的WebSocket实例，连接到指定的URL
let ws = new WebSocket('ws://localhost:3333/ws');

// 定义用于心跳检测的定时器变量
let heartbeatTimer:any; // 用于定期发送心跳消息的定时器
let timeoutTimer:any;   // 用于检测超时的定时器

// 当WebSocket连接成功建立后调用此函数
ws.onopen = () => {
    startHeartbeat(); // 启动心跳检测机制
};

/**
 * 开始心跳检测
 * 每隔30秒发送一次心跳消息，并设置一个35秒的超时检测
 */
function startHeartbeat() {
    heartbeatTimer = setInterval(() => {
        // 如果WebSocket连接处于打开状态（即已连接）
        if (ws.readyState === WebSocket.OPEN) {
            // 发送心跳消息给服务器
            ws.send(JSON.stringify({ type: 'heartbeat' }));
            
            // 设置超时定时器：如果35秒内没有收到服务器的响应，则关闭连接
            timeoutTimer = setTimeout(() => {
                ws.close();
            }, 35000);
        } else {
            // 如果WebSocket连接不是打开状态，则清除所有定时器
            clearInterval(heartbeatTimer);
            clearTimeout(timeoutTimer);
        }
    }, 30000); // 每30秒执行一次
}

/**
 * 重置超时检测
 * 在收到服务器的心跳回应后调用此函数，以避免不必要的连接关闭
 */
function resetTimeout() {
    // 清除当前的超时定时器
    clearTimeout(timeoutTimer);

    // 如果WebSocket连接仍然处于打开状态，则重新设置超时定时器
    if (ws.readyState === WebSocket.OPEN) {
        timeoutTimer = setTimeout(() => {
            ws.close();
        }, 35000);
    }
}

// 当WebSocket连接关闭时调用此函数
ws.onclose = () => {
    // 清除所有定时器，确保没有未完成的任务
    clearInterval(heartbeatTimer);
    clearTimeout(timeoutTimer);
};

// 导出startHeartbeat和resetTimeout函数，以便在其他模块中使用
export { startHeartbeat, resetTimeout };